package com.scala.GaojieDefDemo

/**
 * Created by Administrator on 2018/1/28/028.
 */
object GaojieDefDemo {
  def main(args: Array[String]) {
    //定义：(高阶函数，在函数A里传入另一个函数B作为函数A的参数。)
    //函数A就叫做高阶函数，函数B可以是匿名函数，也可以是个普通函数

    //1.普通函数
    def sayHelloFunc(name: String): Unit = {
      println("Hello," + name)
    }
    //2.高阶函数
    def greeting(myName: String, say: (String) => Unit): Unit = {
      say("xiaoming")
      println("我的名字是：" + myName)
    }
    //3.调用高阶函数
    greeting("SA", sayHelloFunc)
    val func: (String) => Unit = sayHelloFunc _
    greeting("ff", func)
    //4.高阶函数通常与匿名函数一起使用
    val niming = (otherName: String) => println(s"你好啊,${otherName}")
    greeting("AD", (otherName: String) => println(s"你好啊,${otherName}"))
    greeting("sD", niming)

    //5.函数柯里化
    def greetingFunc(msg: String) = (name: String) => println(msg + ":" + name)
    val greetingFuncHello = greetingFunc("Hello")
    greetingFuncHello("xiaolin")
    greetingFunc("Hi")("xiaozheng")
    greetingFunc("oh")
    //6.自动类型推断（用来简写代码的）

    def greetingFun(name: String, func: (String) => Unit): Unit = {
      func(name)
    }
    //这是原始的，没简写代码的方法
    greetingFun("leo", (name: String) => println("Hello," + name))
    //-1.可以将参数类型省略
    greetingFun("leo", (name) => println("Hello," + name))
    //-2.甚至当只有一个参数的时候，可以不写括号（不写括号部会有歧义）
    greetingFun("leo", name => println("Hello," + name))
    //-3.如果左侧的输入参数在后侧的代码中有且仅使用一次，使用顺序和参数的输入顺序一致
    //可以省略参数列表，在右侧代码中使用“_”（下划线）；来代替
    greetingFun("leo", println(_))

    //如果右侧代码是调用其它函数，而且参数全部进行传递的情况，可以省略“_”(在第三条成立的情况下)
    greetingFun("leo", println)



    def greetingFun1(name1: String,name2: String, func: (String) => Unit): Unit = {
      func(name1)
    }



  }

}
